/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package repstream.model;

import java.io.IOException;
import javax.media.*;
import javax.media.control.StreamWriterControl;
import javax.swing.JOptionPane;

/**
 *
 * @author bu2spencer
 */
public class MediaPlayer implements Runnable{
    private float t0;
    private float t1;
    private boolean intervalle;
    private Model model;
    private Player player;
    private String urlFilm;
    boolean running;
    static Thread t;
    
    
    public MediaPlayer(Model model) {
        this.model = model;
        System.out.println("bad Mplayer started");
    }
    
    public MediaPlayer(String _nomFichier, float _t0, float _t1, boolean _intervalle) {
        // Récupérer les paramètres
        //this.model = model;
        t0 = _t0;
        t1 = _t1;
        intervalle = _intervalle;
        System.out.println("Good Mplayer started");
        
        // Vérifier que le nom du fichier passé en paramètre ne soit pas nul 
        // Si c'est en ordre, chargement du film 
        if (_nomFichier != null) {
            fChargerFilm(_nomFichier);
        }
    }

    public void fChargerFilm(String _nomFichier) {
        
// Définir l'URL en fonction du nom du fichier 

        //urlFilm = repertoire + _nomFichier + ".avi";
        //urlFilm = "http://www.solti.fr/Clients/INP/start01.avi";
        urlFilm = _nomFichier;

// Création du player 

        try {
            System.setProperty("http.proxyHost", "proxybc.goss.cat.com");
            //save(); // sauvegarde de la video

            player = Manager.createPlayer(new MediaLocator(urlFilm));
            //player = Manager.createPlayer(new MediaLocator("rtsp://127.0.0.1:8500/test.sdp"));
            //player.addControllerListener(player);
            //save(); // sauvegarde de la video            
            // Si la création du player est en ordre, attributs de la fenêtre 
            

            // Cette fonction permet au player d'acquérir toutes les informations 
            // et toutes les ressources qui lui sont nécessaires sur le média 
            //JOptionPane.showMessageDialog(this,                     "Acquésition des ressources et des informations média en cours. \nPatientez S'il vous plait. : ", "Information", JOptionPane.WARNING_MESSAGE);
            player.realize();
            player.start();
            //fGestionTemps(); 

        } catch (Exception error) {

            // Afficher un message d'erreur si nécessaire 
            //JOptionPane.showMessageDialog(this,
            //        "Erreur lors de la création du player !\nMessage d'erreur : " + error.getMessage(), "Attention", JOptionPane.WARNING_MESSAGE);
        }
    }

    public static void start(){
        t = new Thread(new MediaPlayer(null, 0, 0, false));
        t.start();
    }


    
    public void run() {

// Etat du player 

        int state = player.getState();

        while (state != Controller.Started) {
            try {
                t.sleep(100);
                state = player.getState();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        while (t.isAlive()) {

            try {
                Time time = player.getMediaTime();
                state = player.getState();
                double seconds = time.getSeconds();

                if (seconds >= 0.0d) {
                    System.out.println("Time: " + seconds);
                }

                if (state != Controller.Started && state != Controller.Prefetching && state != Controller.Realizing) {
                    running = false;
                }
                t.sleep(1000);

            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }
    public void save() throws IOException, NoProcessorException {

        // SAUVEGARDE DU FLUX
        Processor p = Manager.createProcessor(new MediaLocator(urlFilm));

        jmapps.util.StateHelper sh = new jmapps.util.StateHelper(p);
        sh.configure(10000);
        sh.realize(10000);


        //p.configure();
        //p.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.MPEG));
        //p.realize();
        DataSink sink;
        MediaLocator dest = new MediaLocator("file://C:/save.avi"); // destination = repertoire server web

        try {

            sink = Manager.createDataSink(p.getDataOutput(), dest);
            sink.open();

            StreamWriterControl swc = (StreamWriterControl) p.getControl("javax.media.control.StreamWriterControl");
            swc.setStreamSizeLimit(25000000);

            sh.playToEndOfMedia(5000);


            sink.start();
            sh.playToEndOfMedia(5000);
            sh.close();
            sink.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public String getUrlFilm() {
        return urlFilm;
    }

    public void setUrlFilm(String urlFilm) {
        this.urlFilm = urlFilm;
    }
 

}
